#include "type.h"
#include "kernel.h"
#include "hal.h"
#include <string.h>

int strcmp(const char *str1, const char *str2) {
    int i=0;
    while ((*str1 == *str2) && i<=128) {
        if(*str1=='\0'){
            return 1;
        }
        str1++;
        str2++;
        i++;
        // io_printf("debug\r\n");
    }
    return 0;
}

void strcp(const char *str1, char *str2, int len){
    for (int i=0; i<len; i++) {
        str2[i]=str1[i];
    }
    str2[len]='\0';
}


// void _help();
// void _cls();
// void _version();

int syscmd_num=3;

#undef  sc
#define sc(name) #name,

char syscmd[256][256]= { 
#include "syscmd.h"
};

#undef sc
#define sc(name) _##name,

void (*_syscmd[256])()= {
#include "syscmd.h"
};

void _cls(){
    io_printf("cls called!\n\r");
    return;
}

void _help(){
    io_printf("cmd list:\r\n");
    for (int i=0; i<syscmd_num; i++) {
        io_printf(&syscmd[i][0]);
        io_printf("\r\n");
    }
}

void _version(){
    TK_logo();
    io_printf("\r\n");
    io_printf("TKernel Version 0.0.1\r\n");
    return;
}

void TK_logo(){
    io_printf("----------  ||  // \r\n");
    io_printf("|        |  || //  \r\n");
    io_printf("---    ---  ||//   \r\n");
    io_printf("  |    |    ||\\\\    \r\n");
    io_printf("  |    |    || \\\\    \r\n");
    io_printf("  |    |    ||  \\\\   \r\n");
    io_printf("  ------    ||   \\\\  \r\n");
}

void analysis(char* command){
    // io_printf(command);
    // io_printf("\r\n");
    char str[256]="";
    int i=0;
    for (i=0; i<512; i++) {
        if(command[i]==' ' || command[i]=='\0' && i>0){
            break;
        }
    }
    strcp(command, str, i);
    command[i]=' ';
    command[i+1]='\0';
    for (int j=0; j<i && j<syscmd_num; j++) {
    // io_printf(command);
    // if(strcmp(str, "") || strcmp(str, " ")) return;
    if(strcmp(command, &syscmd[j][0])) {
        // io_printf(&syscmd[j][0]);
        _syscmd[j]();
        return;
        }
    }
    io_printf("Unkown Command!");
    return;
}

void shell(){
    char ch;
    char cmd[512];
    unsigned int back=0;
    io_printf("\r\nARE U OK SH v0.0.1\r\n");

    while(1){
        back=0;
        io_printf("\r\n[ring0]tkernel> ");
        for(int32_t i=0;i<512;i++) {
            ch = gets_serial();
            if(ch=='\r' || ch=='\n') {break;}
            if(ch!='\b') {
                cmd[back]=ch;
                putc_serial(ch);
                back++;
            }else if(back>0) {
                back--;
                cmd[back]=' ';
                putc_serial('\b');
                putc_serial(' ');
                putc_serial('\b');

            }
        }
        // io_printf("\r\n");
        cmd[back]='\0';
        // io_printf("you press:");
        // io_printf(cmd);
        // io_printf("\r\n");
        if(strcmp(cmd, "") || strcmp(cmd, " ")) continue;;
        analysis(cmd);
    }
}
